home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turnbull China Bikeride
/
Turnbull China Bikeride - Disc 2.iso
/
BARNET
/
GNU
/
LIBC
/
STRLEN
< prev
Wrap
Text File
|
1997-05-04
|
2KB
|
37 lines
/* size_t strlen(const char *S)
* entry: r0 -> string
* exit: r0 = len
*/
strlen:
bic r1, r0, #3 @ addr of word containing first byte
ldr r2, [r1], #4 @ get the first word
ands r3, r0, #3 @ how many bytes are duff?
rsb r0, r3, #0 @ get - that number into counter.
beq Laligned @ skip into main check routine if no more
orr r2, r2, #0xFF000000 @ set this byte to non-zero
subs r3, r3, #1 @ any more to do?
orrgt r2, r2, #0x00FF0000 @ if so, set this byte
subs r3, r3, #1 @ more?
orrgt r2, r2, #0x0000FF00 @ then set.
Laligned: @ here, we have a word in r2. Does it
tst r2, #0x000000FF @ contain any zeroes?
tstne r2, #0x0000FF00 @
tstne r2, #0x00FF0000 @
tstne r2, #0xFF000000 @
addne r0, r0, #4 @ if not, the string is 4 bytes longer
ldrne r2, [r1], #4 @ and we continue to the next word
bne Laligned @
Llastword: @ drop through to here once we find a word
tst r2, #0x000000FF @ that has a zero byte in it
addne r0, r0, #1 @
tstne r2, #0x0000FF00 @ and add up to 3 bytes on to it
addne r0, r0, #1 @
tstne r2, #0x00FF0000 @ (if first three all non-zero, 4th must
addne r0, r0, #1 @ be zero)
#ifdef 26BIT /* is there a predefined symbol for this? */
movs pc, r14
#else /* 26BIT */
mov pc, r14
#endif /* 26BIT */